﻿#ifndef LK_GAME_DIRECTIONCONTROL_
#define LK_GAME_DIRECTIONCONTROL_
/**@author W意波编写*/
namespace LK
{
	/**brief Game命名空间包含与游戏相关的类型*/
    namespace Game
    {
		/**@brief 方向控制器实体*/
        struct DirectionControl:Object
        {
            short pressedKeysCount;/**@brief 四个按键中，已按下数量*/
			char lastd;/**@brief 最后一次方向*/
            char KeysList[4];/**@brief 按键优先级*/
            char KeysValue[4];/**@brief 按键值,对应上下左右键*/
			LK::Mutex tc;//线程同步
        public:
			BMETHODS(PDirectionControl,DirectionControl)
            void setkey_up(char);char getkey_up()const{return KeysValue[0];}
            void setkey_down(char);char getkey_down()const{return KeysValue[1];}
            void setkey_left(char);char getkey_left()const{return KeysValue[2];}
            void setkey_right(char);char getkey_right()const{return KeysValue[3];}
			char getlastKey()const{ for (int i = 0; i < 4; ++i)if (KeysList[0] == KeysValue[i])return const_cast<char&>(lastd)=i; return lastd; }
			/**@brief 默认构造函数*/
            DirectionControl();
			/**@brief 构造函数*/
            DirectionControl(char key_up,char key_down,char key_left,char key_right);
			/**@brief 发生key按下事件时请调用此方法*/
            bool KeyDown(char keyValue);
			/**@brief 发生key弹起事件时请调用此方法*/
            bool KeyUp(char KeyValue);
			/**@brief 当前方向,-1代表无按键，0代表上，1代表下，2代表左，3代表右*/
            char CurrentDirection();
            operator char(){return CurrentDirection();}
        };
		/**@brief 方向控制器代理*/
		struct PDirectionControl:PObject
		{
		public:
			PMETHODS_NODEFCTOR(PDirectionControl, DirectionControl);
			/**@brief 获取向上的按键号*/
			char GetKeyUp()const{ return Ptr()->getkey_up(); }
			/**@brief 设置向上的按键号*/
			void SetKeyUp(char key){ Ptr()->setkey_up(key); }
			/**@brief 获取向下的按键号*/
			char GetKeyDown()const{ return Ptr()->getkey_down(); }
			/**@brief 设置向下的按键号*/
			void SetKeyDown(char key){ Ptr()->setkey_down(key); }
			/**@brief 获取向左的按键号*/
			char GetKeyLeft()const{ return Ptr()->getkey_left(); }
			/**@brief 设置向左的按键号*/
			void SetKeyLeft(char key){ Ptr()->setkey_left(key); }
			/**@brief 获取向右的按键号*/
			char GetKeyRight()const{ return Ptr()->getkey_right(); }
			/**@brief 设置向右的按键号*/
			void SetKeyRight(char key){ Ptr()->setkey_right(key); }
			/**@brief 获取向右的按键号*/
			char GetKeyLastDirection()const{ return Ptr()->getlastKey(); }
			/**@brief 构造函数*/
			PDirectionControl(char key_up, char key_down, char key_left, char key_right) :PObject(new DirectionControl(key_up, key_down, key_left, key_right)){}
			/**@brief 默认构造函数*/
			PDirectionControl() :PObject(new DirectionControl()){}
			/**@brief 发生key按下事件时请调用此方法*/
			bool KeyDown(char keyValue){ return Ptr()->KeyDown(keyValue); }
			/**@brief 发生key弹起事件时请调用此方法*/
			bool KeyUp(char keyValue){ return Ptr()->KeyUp(keyValue); }
			/**@brief 当前方向,-1代表无按键，0代表上，1代表下，2代表左，3代表右*/
			operator char(){ return Ptr()->CurrentDirection(); }
		};
   }
}
#endif